package modele;

import java.io.*;
import java.util.*;
/**
 * Classe effectuant le travail de lecture et d'ecriture des donnees manipulees par l'utilisateur
 * @author Plancq Charlotte, Lanvin Kévin, Darras Raphael
 *
 *
 */
public class LectureEcriture {
	/**
	 * Lit les donnees dans le fichier
	 */
	private static BufferedReader readerAlbums,readerCollections,readerBdt;
	/**
	 * Ecrit les donnees dans le fichier
	 */
	private static PrintWriter writerAlbums,writerCollections,writerBdt;
	/**
	 * Fichier contenant les donnees relatives aux albums
	 */
	private static File falbums;
	/**
	 * Fichier contenant les donnees relatives aux collections
	 */
	private static File fcollections;
	/**
	 * Fichier contenant les donnees relatives a la BDtheque
	 */
	private static File fbdt;

/**
 * Recupere mes donnees utiles a l'ecriture, initialise les lecteurs,
 * ecris dans le fichier, et initialise les collections de la BDtheque
 * @param BDtheque
 * @param File
 * @throws IOException
 */
	public static void importBdtheque(Bdtheque bdt,File fichierbdt) throws IOException{
/*	Je recupere d'abord tout ce dont j'ai besoin pour ecrire */	
		try {
			fbdt=fichierbdt;
			// On s'assure que bdt existe bien
			fbdt.createNewFile();
			// Initialisation du reader
			readerBdt=new BufferedReader(new FileReader(fbdt));
			// On recupere les deux pathname et on en fait des fichiers
			falbums = new File(readerBdt.readLine());
			fcollections = new File(readerBdt.readLine());
			// On s'assure que les fichiers r�cup�r�s existent bien
			falbums.createNewFile();
			fcollections.createNewFile();
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
		try {
			//Initialisation des readers
			readerAlbums=new BufferedReader(new FileReader(falbums));
			readerCollections=new BufferedReader(new FileReader(fcollections));
		} catch (IOException e) {
			e.printStackTrace();
		}

		
		
/* Ensuite j'ecris dans les fichiers */		
		
		// Je cr�e la collection 0 , avec tous les albums
		ArrayList<Album> albums=new ArrayList<Album>();
		// Hashmap qui permettra d'avoir les references
		HashMap<String, Integer>map=new HashMap<String, Integer>();
		String ligne;
		String [] separe;
		int i=0;
		try{
			//Je lis dans le fichier album, je cree l'album et l'ajoute e la liste d'albums et je mets la reference dans la hashmap
			while((ligne=readerAlbums.readLine())!=null){
				separe=ligne.split(":");
				albums.add(i, new Album(separe[1], separe[2], separe[3], separe[4], separe[5], separe[6],Integer.parseInt(separe[7]),separe[8], separe[9]));
				map.put(separe[0], i);
				++i;
			}
			//Je cree la premiere collection
			CollectionAlbums zero=new CollectionAlbums(bdt, "Tous");
			zero.addAll(albums);
			// Je cree la liste de collections et y ajoute C0
			ArrayList<CollectionAlbums> collections= new ArrayList<CollectionAlbums>();

			//Je lis dans fcollections
			while((ligne=readerCollections.readLine())!=null){
				separe=ligne.split(":");
				CollectionAlbums courante=new CollectionAlbums(bdt,separe[0]);
				//Pour chaque collection, je recupere tous les albums grace a l'index de la hashmap
				for(int j=1;j<separe.length;++j)
					courante.add(zero.getElementAt(map.get(separe[j])));
				//J'ajoute ensuite la collection e la liste et je recommence
				collections.add(courante);
			}
			//Enfin j'initialise les collections de bdt
			bdt.setCollections(collections);
		}catch(NullPointerException e){
			e.printStackTrace();
		}
	}

	/**
	 * Enregistre les donnees dans le fichier
	 * @param BDtheque
	 * @param File
	 */
	public static void enregistrer(Bdtheque bdt,File fichierbdt){
		fbdt=fichierbdt;

		// Je supprime les fichiers existants pour en faire nouveaux
		try {
			fbdt.delete();
			fbdt.createNewFile();

			falbums=new File(fbdt.getName().substring(0, fbdt.getName().length()-4)+"albums.bdt");
			fcollections=new File(fbdt.getName().substring(0, fbdt.getName().length()-4)+"collections.bdt");
			falbums.delete();
			fcollections.delete();
			falbums.createNewFile();
			fcollections.createNewFile();
			
			// Initialisation des Writers
			writerBdt=new PrintWriter(new FileWriter(fbdt,true),true);
			writerAlbums=new PrintWriter(new FileWriter(falbums, true), true);
			writerCollections=new PrintWriter(new FileWriter(fcollections, true), true);
			writerBdt.println(falbums.getPath());
			writerBdt.println(fcollections.getPath());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
				
		
		// Je recupere la collection 0
		CollectionAlbums albums=bdt.getElementAt(0);
		
		// Je cree la liste des references
		ArrayList<String>references=new ArrayList<String>();
		String i="AAA";
		Iterator<?> it = albums.iterator();
		// J'attribue une reference a chaque album et je l'ajoute a ma liste de references
		while(it.hasNext()){
			Album a=(Album) it.next();
			writerAlbums.println(i+':'+a.getTitre()+':'+a.getAuteur()+':'+a.getEditeur()+':'+a.getGenre()+':'+a.getSerie()+':'+a.getSynopsis()+':'+a.getNote()+':'+a.getCommentaire()+':'+a.getImage()+'.');
			references.add(i);
			i=incrementer(i);
		}

		String line;
		// Je recupere les collections
		for(CollectionAlbums col : bdt.getCollections()){
			line=col.getNom();
			it=col.iterator();
			// Ecriture de la ligne dans collection : nom + liste de references
			while(it.hasNext()){
				Album a=(Album)it.next();
				line+=':'+references.get(albums.getIndexOf(a));
			}
			writerCollections.println(line);
		}
	}

	private static String incrementer(String s) {
		// TODO Auto-generated method stub
		@SuppressWarnings("unused")
		String result=s;
		if (s.charAt(2) == 'Z' && s.charAt(1) != 'Z')
			s = (String)(s.substring(0, 1) + (char)(s.charAt(1)+1)) + "A";
		else if (s.charAt(2) == 'Z' && s.charAt(1) == 'Z' )
			s = (char)(s.charAt(0)+1) + "AA";
		else if (s.charAt(2)=='Z' && s.charAt(1)=='Z' && s.charAt(0)=='Z')
			return null;
		else
			s = (String)(s.substring(0, 2) + (char)(s.charAt(2)+1));
		return s;
	}

}
